//package own.stu.bytebuffer.sim.agent.util;
//
//import io.netty.buffer.PooledByteBufAllocator;
//import io.netty.channel.nio.NioEventLoopGroup;
//import org.asynchttpclient.*;
//
//import java.util.concurrent.CompletableFuture;
//
//public class AsyncHttpHelper {
//
//    private static final class SingletonHolder {
//        private static final AsyncHttpHelper INSTANCE = new AsyncHttpHelper();
//    }
//
//    private AsyncHttpHelper() {
//        initialized();
//    }
//
//    public static AsyncHttpHelper getInstance() {
//        return SingletonHolder.INSTANCE;
//    }
//
//    public void initialized(AsyncHttpClient asyncHttpClient) {
//        this.asyncHttpClient = asyncHttpClient;
//    }
//
//    public void initialized() {
//        init();
//        this.asyncHttpClient = new DefaultAsyncHttpClient(clientBuilder.build());
//    }
//
//    private AsyncHttpClient asyncHttpClient;
//    private DefaultAsyncHttpClientConfig.Builder clientBuilder;
//    private RapidConfig rapidConfig = new RapidConfig();
//
//    public void init() {
//        this.clientBuilder = new DefaultAsyncHttpClientConfig.Builder()
//                .setFollowRedirect(false)
//                .setEventLoopGroup(new NioEventLoopGroup())
//                .setConnectTimeout(rapidConfig.getHttpConnectTimeout())
//                .setRequestTimeout(rapidConfig.getHttpRequestTimeout())
//                .setMaxRequestRetry(rapidConfig.getHttpMaxRequestRetry())
//                .setAllocator(PooledByteBufAllocator.DEFAULT)
//                .setCompressionEnforced(true)
//                .setMaxConnections(rapidConfig.getHttpMaxConnections())
//                .setMaxConnectionsPerHost(rapidConfig.getHttpConnectionsPerHost())
//                .setPooledConnectionIdleTimeout(rapidConfig.getHttpPooledConnectionIdleTimeout());
//    }
//
//    public CompletableFuture<Response> executeRequest(Request request) {
//        ListenableFuture<Response> future = asyncHttpClient.executeRequest(request);
//        return future.toCompletableFuture();
//    }
//
//    public <T> CompletableFuture<T> executeRequest(Request request, AsyncHandler<T> handler) {
//        ListenableFuture<T> future = asyncHttpClient.executeRequest(request, handler);
//        return future.toCompletableFuture();
//    }
//}
